package persistence.dao;

import org.hibernate.Session;

import persistence.model.Projet;
import util.HibernateUtil;

/**
 * @author Florent
 *
 */
public class ProjetDAO {

	/**
	 * La prŽsence d'un constructeur privŽ supprime le constructeur public par
	 * dŽfaut.
	 */
	private ProjetDAO() {

	}

	/**
	 * 
	 */
	private static ProjetDAO INSTANCE = null;

	/**
	 * Le mot-clŽ synchronized sur la mŽthode de crŽation emp�che toute
	 * instanciation multiple même par différents threads. Retourne l'instance
	 * du singleton.
	 */
	public synchronized static ProjetDAO getInstance() {
		if (INSTANCE == null) {
			INSTANCE = new ProjetDAO();
		}
		return INSTANCE;
	}

	/**
	 * @param projet
	 * @return
	 */
	public Projet createProject(final Projet projet) {
		final Session session = HibernateUtil.getSessionFactory()
				.getCurrentSession();
		// try catch � ajouter sur les HibernateExeptions
		// attention, pour mettre � jour les DO persistants, �a doit �tre g�r�
		// en cascade, via la configuration ad�quate.
		session.beginTransaction();
		session.save(projet);
		session.getTransaction().commit();
		return projet;
	}

	/**
	 * @param idProjet
	 * @return
	 */
	public Projet getProjetFromId(final long idProjet) {
		Projet projet = new Projet();
		final Session session = HibernateUtil.getSessionFactory()
				.getCurrentSession();
		session.beginTransaction();
		projet = (Projet) session
				.createQuery("from Projet where idProjet = :id")
				.setLong("id", idProjet).uniqueResult();
		session.getTransaction().commit();
		return projet;
	}

	/**
	 * @param projet
	 * @return
	 */
	public boolean deleteProject(final Projet projet) {
		final Session session = HibernateUtil.getSessionFactory()
				.getCurrentSession();
		session.beginTransaction();
		final Projet project = (Projet) session
				.createQuery("from Projet where idProjet = :id")
				.setLong("id", projet.getIdProjet()).uniqueResult();
		session.delete(project);
		session.getTransaction().commit();
		return true;
	}

	/**
	 * @param projet
	 * @return
	 */
	public boolean updateProject(final Projet projet) {
		final Session session = HibernateUtil.getSessionFactory()
				.getCurrentSession();
		session.beginTransaction();
		session.update(projet);
		session.getTransaction().commit();
		return true;
	}

}
